// src/router/index.js
import { createRouter, createWebHistory } from "vue-router";
import { useUserStore } from "@/store/user";
import { useTabsStore } from "@/store/tabs";
import { useAppStore } from "@/store/app";
import { constantRoutes } from "./routes/constant";
import { localStaticMenus } from "./routes/static";
import { specialRoutes } from "./routes/special";
import { transformBackendRoutes } from "./utils/transform";

const router = createRouter({
  history: createWebHistory(),
  routes: constantRoutes,
});

// 动态路由是否已添加的标志
let dynamicRoutesAdded = false;
// 当前用户token，用于检测用户切换
let currentUserToken = null;

// 检查用户是否有权限访问指定路由
function hasPermission(route, userStore) {
  // 如果是404页面，允许访问
  if (route.path === '/404' || route.name === '404') {
    return true;
  }
  
  // 如果是重定向页面，允许访问
  if (route.path.startsWith('/redirect')) {
    return true;
  }
  
  // 检查是否是特殊路由（所有登录用户都可以访问）
  const isSpecialRoute = specialRoutes.some(r => r.path === route.path);
  if (isSpecialRoute) {
    return true;
  }
  
  // 检查是否是本地静态菜单（所有登录用户都可以访问）
  const isStaticRoute = localStaticMenus.some(r => r.path === route.path);
  if (isStaticRoute) {
    return true;
  }
  
  // 获取用户的所有动态路由权限
  const userRoutes = userStore.dynamicRoutes || [];
  
  // 检查当前路由是否在用户权限中
  const hasRoutePermission = userRoutes.some(userRoute => {
    // 精确匹配路径
    if (userRoute.path === route.path) {
      return true;
    }
    
    // 检查子路由
    if (userRoute.children && userRoute.children.length > 0) {
      return userRoute.children.some(child => {
        const fullPath = child.path.startsWith('/') 
          ? child.path 
          : `${userRoute.path}/${child.path}`.replace(/\/+/g, '/');
        return fullPath === route.path;
      });
    }
    
    return false;
  });
  
  return hasRoutePermission;
}

// 路由守卫
router.beforeEach(async (to, from, next) => {
  const userStore = useUserStore();
  const appStore = useAppStore();

  // 设置页面标题（从全局配置读取系统标题）
  if (to.meta.title) {
    document.title = `${to.meta.title} - ${appStore.settings.Title}`;
  }

  // 检查路由是否需要登录（默认需要登录）
  const requiresAuth = to.meta.requiresAuth !== false;

  // 不需要登录的页面，直接放行
  if (!requiresAuth) {
    next();
    return;
  }

  // 需要登录但未登录，跳转到登录页
  if (!userStore.isLogin) {
    next("/login");
    return;
  }

  // 检查是否需要重新加载动态路由
  const needReloadRoutes = !dynamicRoutesAdded || currentUserToken !== userStore.token;
  
  if (needReloadRoutes) {
    try {
      // 如果没有用户信息，先获取
      if (!userStore.userInfo) {
        await userStore.getUserInfo();
      }
      
      // 如果用户切换了，需要重置路由
      if (dynamicRoutesAdded && currentUserToken !== userStore.token) {
        console.log('检测到用户切换，重新加载动态路由');
        // 清除所有动态路由
        clearDynamicRoutes();
        dynamicRoutesAdded = false;
      }
      
      // 添加动态路由
      await addDynamicRoutes();
      dynamicRoutesAdded = true;
      currentUserToken = userStore.token;
      
      // 动态路由加载完成后，重新进入路由（让路由重新匹配）
      next({ ...to, replace: true });
    } catch (error) {
      console.error('加载动态路由失败:', error);
      userStore.logout();
      next("/login");
    }
  } else {
    // 动态路由已加载，检查权限
    if (!hasPermission(to, userStore)) {
      console.log('用户无权限访问:', to.path);
      next("/404");
      return;
    }
    next();
  }
});

// 路由后置守卫 - 添加页签
router.afterEach((to) => {
  const tabsStore = useTabsStore();
  // 添加页签（排除登录页和重定向页）
  if (to.path !== '/login' && !to.path.startsWith('/redirect')) {
    tabsStore.addTab(to, router);
  }
});

// 添加动态路由
async function addDynamicRoutes() {
  const userStore = useUserStore();

  // 1. 获取服务端返回的动态路由
  const backendRoutes = userStore.dynamicRoutes || [];
  
  // 2. 转换服务端路由格式
  const transformedRoutes = transformBackendRoutes(backendRoutes);
  console.log('服务端动态路由:', transformedRoutes);

  // 3. 合并所有子路由：本地静态菜单 + 服务端动态路由 + 特殊路由
  // 使用 Map 来去重，避免重复的路由
  const routesMap = new Map();
  
  // 先添加特殊路由
  specialRoutes.forEach(route => {
    routesMap.set(route.path, route);
  });
  
  // 再添加服务端动态路由
  transformedRoutes.forEach(route => {
    routesMap.set(route.path, route);
  });
  
  // 最后添加本地静态菜单（优先级最低，会被覆盖）
  localStaticMenus.forEach(route => {
    if (!routesMap.has(route.path)) {
      routesMap.set(route.path, route);
    }
  });
  
  const allChildren = Array.from(routesMap.values());

  // 4. 构建完整的布局路由
  const layoutRoute = {
    path: "/",
    component: () => import("@/layouts/BasicLayout.vue"),
    redirect: "/dashboard",
    meta: { title: "首页" },
    children: allChildren,
  };

  // 5. 添加路由到路由表
  router.addRoute(layoutRoute);
  console.log('已添加路由，总计菜单数:', allChildren.length);
  console.log('- 本地静态菜单:', localStaticMenus.length);
  console.log('- 服务端动态路由:', transformedRoutes.length);
  console.log('- 特殊路由:', specialRoutes.length);

  // 6. 添加404页面捕获
  router.addRoute({ path: "/:pathMatch(.*)*", redirect: "/404" });
}

// 清除动态路由
function clearDynamicRoutes() {
  // 获取所有路由
  const routes = router.getRoutes();
  
  // 移除所有动态路由（除了基础路由和特殊路由）
  routes.forEach(route => {
    if (route.name && !['Login', '404', 'Order', 'Redirect', 'RouterDetail'].includes(route.name)) {
      router.removeRoute(route.name);
    }
  });
}

// 重置动态路由标志（用于登出时）
export function resetRouter() {
  dynamicRoutesAdded = false;
  currentUserToken = null;
}

export default router;
